package xaj.scc.ast;

import polyglot.ast.Block;
import polyglot.ast.ClassMember;
import polyglot.ast.TypeNode;
import polyglot.ast.Import.Kind;
import polyglot.types.Flags;
import polyglot.util.Position;

import java.util.List;

import abc.aspectj.ast.AJNodeFactory;

public interface SCNodeFactory extends AJNodeFactory {
	public SyntaxClassDecl SyntaxClassDecl(Position pos, Flags flags,
			String name, TypeNode superClass, List interfaces, SyntaxClassBody body);
	public SyntaxClassBody SyntaxClassBody(Position pos, NumberOfPasses number,
			SyntaxDeclaration sd, List<ClassMember> classmembers);
	public SyntaxClassBody SyntaxClassBody(Position pos, NumberOfPasses number,
			SyntaxDeclaration sd, OnWeaving ow, List<ClassMember> classmembers);
	public OnWeaving OnWeaving(Position pos, String name, List<ClassMember> productions);
	//public OnWeaving OnWeaving();
	public NumberOfPasses NumberOfPasses(Position pos, int number);	
	public SyntaxDeclarationInsertion SyntaxDeclarationInsertion(Position pos,
			List<String> using, List<Production> productions);
	public SyntaxDeclarationInsertion SyntaxDeclarationInsertion(Position pos, String nonTerminal,
			List<String> using, List<Production> productions);
	public SyntaxDeclarationOverrides SyntaxDeclarationOverrides(Position pos, String name);
	public Production Production(Position pos, String nonTerminal, List<ProductionElement> list);
	public ProductionElement ProductionElement(Position pos, Factor factor,
			SemanticAction action);
	public SimpleFactor SimpleFactor(Position pos, String value);
	public StringFactor StringFactor(Position pos, String value);
	//public ParenFactor ParenFactor(Position pos, List<List<Factor>> factors);
	public OrFactor OrFactor(Position pos, Factor left, Factor right);
	public ConcatFactor ConcatFactor(Position pos, Factor left, Factor right); 
	public OptionalFactor OptionalFactor(Position pos, Factor factor);
	public ClosureFactor ClosureFactor(Position pos, Factor factor);
	
	public NamedFactor NamedFactor(Position pos, String name, Factor factor);
	public LambdaFactor LambdaFactor(Position pos);
	public SemanticAction SemanticAction(Position pos, Block block);
	public ImportSyntax ImportSyntax(Position pos, Kind kind, String name);
	public ImportSymbol ImportSymbol(Position pos, Kind kind, String name);
	
}
